/*
实验11-5 新浪微博热门话题
分数 30
作者 DS课程组
单位 浙江大学

新浪微博可以在发言中嵌入“话题”，即将发言中的话题文字写在一对“#”之间，就可以生成话题链接，点击链接可以看到有多少人在跟自己讨论相同或者相似的话题。新浪微博还会随时更新热门话题列表，并将最热门的话题放在醒目的位置推荐大家关注。

本题目要求实现一个简化的热门话题推荐功能，从大量英文（因为中文分词处理比较麻烦）微博中解析出话题，找出被最多条微博提到的话题。
输入格式:

输入说明：输入首先给出一个正整数 n（≤10^5），随后 n
行，每行给出一条英文微博，其长度不超过 140
个字符。任何包含在一对最近的“#”中的内容均被认为是一个话题，如果长度超过40个字符，则只保留前40个字符。输入保证“#”成对出现。
输出格式:

第一行输出被最多条微博提到的话题，第二行输出其被提到的微博条数。如果这样的话题不唯一，则输出按字母序最小的话题，并在第三行输出
And k more ...，其中 k 是另外几条热门话题的条数。输入保证至少存在一条话题。

注意：两条话题被认为是相同的，如果在去掉所有非英文字母和数字的符号、并忽略大小写区别后，它们是相同的字符串；同时它们有完全相同的分词。输出时除首字母大写外，只保留小写英文字母和数字，并用一个空格分隔原文中的单词。
输入样例:

4
This is a #test of topic#.
Another #Test of topic.#
This is a #Hot# #Hot# topic
Another #hot!# #Hot# topic

输出样例:

Hot
2
And 1 more ...
*/

/*
测试没通过：
3	最大N；最长微博；最长话题
*/

#include <algorithm>
#include <cctype>
#include <iostream>
#include <regex>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

// Helper function to normalize the topic using regular expressions
string normalizeTopic(const string &topic) {
    string normalized;
    bool beforeSpace = false;
    int cnt = 0;

    for (char c : topic) {
        if (isalnum(c)) {
            if (beforeSpace && cnt > 0) {
                normalized += ' ';
                cnt++;
            }
            normalized += tolower(c);
            beforeSpace = false;
            cnt++;
        } else {
            beforeSpace = true;
        }
        if (cnt >= 40) {
            break;
        }
    }
    // 首字母大写
    if (!normalized.empty()) {
        normalized[0] = toupper(normalized[0]);
    }
    if (normalized.size() > 40) {
        normalized = normalized.substr(0, 40);
    }
    // 去除末尾的空格
    while (!normalized.empty() && isspace(normalized.back())) {
        normalized.pop_back();
    }

    return normalized;
}

// int main() {
//     cout << normalizeTopic("012345678901234567890123456789012345678 9")
//          << "]" << endl;
//     return 0;
// }

int main() {
    int n;
    cin >> n;
    cin.ignore();

    unordered_map<string, unordered_set<int>> topicMap;
    string tweets;
    regex topicRegex("#([^#]+)#");

    for (int i = 0; i < n; ++i) {
        getline(cin, tweets);
        auto words_begin = sregex_iterator(tweets.begin(), tweets.end(), topicRegex);
        auto words_end = sregex_iterator();

        for (auto it = words_begin; it != words_end; ++it) {
            string topic = it->str(1);
            if (topic.size() > 40) {
                topic = topic.substr(0, 40);
            }
            string normalized = normalizeTopic(topic);
            cout << normalized << endl;
            if (normalized.size() > 40) {
                normalized = normalized.substr(0, 40);
            }
            topicMap[normalized].insert(i);
        }
    }

    string mostPopularTopic;
    int maxCount = 0;
    for (const auto &entry : topicMap) {
        if (entry.second.size() > maxCount) {
            maxCount = entry.second.size();
            mostPopularTopic = entry.first;
        } else if (entry.second.size() == maxCount && entry.first < mostPopularTopic) {
            mostPopularTopic = entry.first;
        }
    }

    cout << mostPopularTopic << endl;
    cout << maxCount << endl;

    int additionalTopics = 0;
    for (const auto &entry : topicMap) {
        if (entry.second.size() == maxCount && entry.first != mostPopularTopic) {
            ++additionalTopics;
        }
    }

    if (additionalTopics > 0) {
        cout << "And " << additionalTopics << " more ..." << endl;
    }

    return 0;
}
